/*
 * @Author: 刘凯欣
 * @Date: 2025-11-07 09:14:57
 * @LastEditors: happyBoomL
 * @LastEditTime: 2025-11-08 16:12:04
 * @Description: 
 */
const express = require('express');
const router = express.Router();
const {
    Article
} = require('../../models')

// Op是Sequelize的运算符，用于构建查询条件
const {
    Op
} = require('sequelize')



/**
 * @description: 查询文章列表
 * @return {*}
 */
router.get("/", async function (req, res) {
    try {
        const query = req.query;
        // 定义查询条件
        const conditions = {
            // 这里在数组里又嵌套了数组。这就说明，排序可能不止按一个字段来排序，也可能同时按多个字段来排序。
            order: [
                ['id', 'desc']
            ]
        }

        // SELECT *
        // FROM `Articles`
        // WHERE title LIKE '%文章10%'
        // 增加搜索条件
        if (query.title) {
            conditions.where = {
                title: {
                    [Op.like]: `%${query.title}%`
                }
            }
        }
        // 增加 分页功能

        // 原始sql
        // SELECT *
        // FROM `Articles`
        // LIMIT 0,10

        // 处理用户传入的可能是负数的问题  || 1 表示如果用户没有传入page和pageSize，则默认为1和10
        const page = Math.abs(Number(query.page)) || 1;
        const pageSize = Math.abs(Number(query.pageSize)) || 10;
        if(page && pageSize){
            conditions.offset = (page - 1) * pageSize;
            conditions.limit = pageSize;
        }

        // const articles = await Article.findAll(conditions);
        
        const articles = await Article.findAndCountAll(conditions);

        res.json({
            status: 200,
            message: "成功",
            data:{
                list: articles.rows,
                pagination: {
                    total: articles.count,
                    page: page,
                    pageSize: pageSize
                }
            }
        });
    } catch (error) {
        res.json({
            status: 500,
            message: "失败",
            error: error.message
        });
    }
});

/**
 * @description: 文章详情接口
 * @return {*}
 */
router.get("/:id", async function (req, res) {
    try {
        const {
            id
        } = req.params;
        // 方法1
        // const conditions = {
        //     where: {
        //         id: id
        //     }
        // }
        // const article = await Article.findAll(conditions);
        // if(article.length) 她是数组，所以要用length来判断



        // 方法2
        // id在数据库中也就是主键，主键的英文是primary key，缩写一下就是pk
        // 这里使用findByPk方法来查询文章，findByPk方法的参数是主键的值
        const article = await Article.findByPk(id);

        if (article) {
            res.json({
                status: 200,
                message: "成功",
                data: article
            })
        } else {
            res.json({
                status: 404,
                message: "文章不存在",
                data: null
            })
            return;
        }
    } catch (error) {
        res.json({
            status: 500,
            message: "失败",
            error: error.message
        })
    }
})


/**
 * @description: 添加文章接口
 * @return {*}
 */
router.post("/", async function (req, res) {
    try {
        const {
            title,
            content
        } = req.body;
        const article = await Article.create({
            title,
            content
        })
        res.status(201).json({
            status: true,
            message: "成功",
            data: article
        })
    } catch (error) {
        res.json({
            status: 500,
            message: "失败",
            error: error.message
        })
    }
})
/**
 * 更新文章
 * PUT /admin/articles/:id
 */
router.put('/:id', async function (req, res) {
    try {
        const {
            id
        } = req.params;
        const article = await Article.findByPk(id);

        if (article) {
            // 注意  这个 的 update 是 model 的 update ，不是 Article 的 update
            await article.update(req.body);

            res.json({
                status: true,
                message: '更新文章成功。',
                data: article
            });
        } else {
            res.status(404).json({
                status: false,
                message: '文章未找到。',
            });
        }
    } catch (error) {
        res.status(500).json({
            status: false,
            message: '更新文章失败。',
            errors: [error.message]
        });
    }
});

/**
 * @description: 删除文章接口
 * @return {*}
 */

router.delete('/:id', async function (req, res) {
    try {
        const {
            id
        } = req.params;
        const article = await Article.findByPk(id);
        if (article) {
            // 注意 这里的 destroy 是 model 的 destroy ，不是 Article 的 destroy
            await article.destroy();
            res.status(200).json({
                status: true,
                message: "删除文章成功",
            })
        } else {
            res.status(404).json({
                status: false,
                message: "文章id不存在"
            })
        }
    } catch (error) {
        res.status(500).json({
            status: false,
            message: "删除文章失败",
            error: error.message
        })
    }
})




module.exports = router;